//题目
// 给你一个整数数组 nums ，请你求出乘积为正数的最长子数组的长度。
// 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
// 请你返回乘积为正数的最长子数组长度。
#include<iostream>
#include<limits.h>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int getMaxLen(vector<int>& nums) 
    {
        //1.创建dp细化表
        vector<int> f(nums.size());//f[i]表示以nums[i]为结尾的乘积为正数最长子数组长度
        vector<int> g(nums.size());//g[i]表示以nums[i]为结尾的乘积为负数最长子数组长度
        //2.初始化
        if(nums[0]>0) f[0]=1,g[0]=0;
        else if(nums[0]<0) f[0]=0,g[0]=1;
        else f[0]=0,g[0]=0;
        //3.填表————动态转移方程
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]==0) f[i]=0,g[i]=0;
            else if(nums[i]>0)
            {
                f[i]=f[i-1]+1;
                g[i]=g[i-1]==0?0:g[i-1]+1;
            }
            else
            {
                f[i]=g[i-1]==0?0:g[i-1]+1;
                g[i]=f[i-1]+1;
            }
        }
        //4.确定返回值
        int ret=0;
        for(int i=0;i<nums.size();i++)
            ret=max(ret,f[i]);
        return ret;
    }
};